<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>无标题文档</title>
<script src="../jquery-2.0.3_code.js" type="text/javascript"></script>
<script src="../doll_1.0.js" type="text/javascript"></script>
<script>
Function.prototype.extend = function(superClass){
        if(typeof superClass === 'function'){//类式继承
            var F = function(){}; //创建一个中间函数对象以获取父类的原型对象
            F.prototype = superClass.prototype; //设置原型对象
            this.prototype = new F(); //实例化F, 继承父类的原型中的属性和方法，而无需调用父类的构造函数实例化无关的父类成员
            this.prototype.constructor = this; //设置构造函数指向自己
            this.superClass = superClass; //同时，添加一个指向父类构造函数的引用，方便调用父类方法或者调用父类构造函数
        } else if(typeof superClass === 'object'){ //方法的扩充
            var pro = this.prototype;
            for(var k in superClass){
                if(!pro[k]){ //如果原型对象不存在这个属性，则复制
                    pro[k] = superClass[k];
                }
            }
        } else {
            throw new Error('fatal error:"Function.prototype.extend" expects a function or object');
        }
         
        return this;
    };
   
 
 
 
 
 
 
  /*Class Person*/
    function Person(name){
        this.name = "{"+name+"}";
		alert("调用了Person的方法"+this.name);
    }
    Person.prototype.getName = function(){
            
			alert("调用了Person的getName方法："+this.name);
			return this.name;
    };
     
     
    /*Class Author*/
    function Author(name, books){
        Author.superClass.call(this, name);
        this.books = books;
    }
	
	function classFunction(){}
	classFunction.prototype.clfunc=function(){
	    alert('classFunction 的方法')	
	}
	 /*调用方式*/
    Author.extend(Person);
//    Author.prototype.constructor=function Author(name, books){
//    Author.superClass.call(this, name);
//    this.books = books;
//    }
	Author.prototype.setName=function(name){
		var name = Author.superClass.call(this, name);
		 
	}
	
	/*方法的覆写，通过superClass调用父类的方法获得基本信息，再调用子类的方法获得更特殊的信息*/
    Author.prototype.getName = function(){
        var name = Author.superClass.prototype.getName.call(this);
        var ret= name + ', Author of ' /*+ this.getBooks();*/
		alert(ret);
		return ret;
    };
	
	
    Author.extend({
        sayHello:function(){
            alert('Hello');
        }
    }).extend(classFunction.prototype);//原型也是对象，所以一样可以作为参数传入，这样便扩展了其他类的原型方法，有点类似多重继承
	Author.extend({
        sayHello2:function(){
            alert('Hello2');
        }
    })
var a1 = new Author('koolfer','jsbook');
a1.sayHello();
a1.clfunc();
a1.sayHello2();
//a1.setName('doll');
a1.getName();
alert(a1.constructor)
</script>
</head>

<body>

</body>
</html>
